#include "nodo_resultado.h"

NodoResultado::NodoResultado() {
	this->setDesriptor(PROMEDIO_MAYOR_A_CUATRO);
	this->setValorDescriptor(false);
	this->setListaAlumnos(0);
	this->setListaHijos(0);
}

NodoResultado::~NodoResultado() {
	if(this->hijos != 0){
		IteradorLista<NodoResultado*> iteradorHijos = this->hijos->iterador();
		while(iteradorHijos.tieneSiguiente()){
			delete iteradorHijos.siguiente();
		}
		delete this->hijos;
	}

	if(this->alumnos != 0){
		delete this->alumnos;
	}
}

NodoResultado::NodoResultado(const NodoResultado &otroNodo) {
	this->setDesriptor(otroNodo.descriptor);
	this->setValorDescriptor(otroNodo.valorDescriptor);

	if(otroNodo.alumnos != 0){
		this->setListaAlumnos(new Lista<Alumno*>);
		IteradorLista<Alumno*> iteradorAlumnos = otroNodo.alumnos->iterador();
		while(iteradorAlumnos.tieneSiguiente()){
			this->getListaAlumnos()->agregar(iteradorAlumnos.siguiente());
		}
	}else{
		this->setListaAlumnos(0);
	}

	if(otroNodo.hijos != 0){
		this->setListaHijos(new Lista<NodoResultado*>);
		IteradorLista<NodoResultado*> iteradorHijos = otroNodo.hijos->iterador();
		while(iteradorHijos.tieneSiguiente()){
			this->getListaHijos()->agregar(iteradorHijos.siguiente());
		}
	}else{
		this->setListaHijos(0);
	}
}

NodoResultado& NodoResultado::operator=(const NodoResultado &otroNodo) {
	if(this != &otroNodo){

		this->setDesriptor(otroNodo.descriptor);
		this->setValorDescriptor(otroNodo.valorDescriptor);

		/**
		 * Copia de los alumnos. No deben eliminarse si ya hay.
		 */
		if(otroNodo.alumnos != 0){
			if(this->getListaAlumnos() == 0){
				this->setListaAlumnos(new Lista<Alumno*>);
			}else{
				IteradorLista<Alumno*> iteradorAlumnos = this->getListaAlumnos()->iterador();
				while(iteradorAlumnos.tieneSiguiente()){
					iteradorAlumnos.remover();
				}
			}
			IteradorLista<Alumno*> iterador = otroNodo.alumnos->iterador();
			while(iterador.tieneSiguiente()){
				this->getListaAlumnos()->agregar(iterador.siguiente());
			}
		}else{
			if(this->getListaAlumnos() != 0){
				delete this->getListaAlumnos();
			}
			this->setListaAlumnos(0);
		}


		if(otroNodo.hijos == 0){
			if(this->getListaHijos() != 0){
				IteradorLista<NodoResultado*> iterador = this->getListaHijos()->iterador();
				while(iterador.tieneSiguiente()){
					delete iterador.get();
					iterador.remover();
				}

				delete this->getListaHijos();
			}
			this->setListaAlumnos(0);
		}else{
			if(this->getListaHijos() != 0){
				IteradorLista<NodoResultado*> iterador = this->getListaHijos()->iterador();
				while(iterador.tieneSiguiente()){
					delete iterador.get();
					iterador.remover();
				}
			}else{
				this->setListaHijos(new Lista<NodoResultado*>);
			}

			IteradorLista<NodoResultado*> iteradorNodos = otroNodo.hijos->iterador();
			while(iteradorNodos.tieneSiguiente()){
				this->getListaHijos()->agregar(iteradorNodos.siguiente());
			}
		}
	}

	return *this;
}

void NodoResultado::setDesriptor(DescriptorAlumno nuevoDescriptor) {
	this->descriptor = nuevoDescriptor;
}

DescriptorAlumno  NodoResultado::getDescriptor() {
	return this->descriptor;
}

void NodoResultado::setValorDescriptor(bool nuevoValor) {
	this->valorDescriptor = nuevoValor;
}

bool NodoResultado::getValorDescriptor() {
	return this->valorDescriptor;
}

void NodoResultado::setListaAlumnos(Lista<Alumno*>* nuevaListaAlumnos) {
	this->alumnos = nuevaListaAlumnos;
}

Lista<Alumno*>* NodoResultado::getListaAlumnos() {
	return this->alumnos;
}

void NodoResultado::setListaHijos(Lista<NodoResultado*>* nuevaListaHijos) {
	this->hijos = nuevaListaHijos;
}

Lista<NodoResultado*>* NodoResultado::getListaHijos() {
	return this->hijos;
}
